Skip to content

Conversation

@Mingguriguri
Copy link
Collaborator

@Mingguriguri Mingguriguri commented Jul 12, 2025

🌱WIL

이번 한 주의 소감을 작성해주세요!

  • 이번 주는 발제 문제 대신 프로그래머스-스킬체크를 풀었다. 레벨3는 도저히 못하겠어서 레벨2로 진행했다... 다음에는 레벨3에 다시 도전해봐야겠다.
    이미 풀었던 문제가 하나 나왔는데 오랜만에 푸니까 아예 접근법이 기억이 나지 않아 헤매게 됐다. 이미 풀었던 문제도 다시 풀어보는 습관을 들여야 할 것 같다는 생각이 들었다. 또 다른 문제(=점프와 순간이동)는 내용이 매우 길었는데 막상 코드는 매우 단순했던 게 인상 깊다.
  • 스킬체크 외에는 구현 문제를 위주로 풀었다. 말이 구현이지만 구현 말고 다른 알고리즘도 쓰였다. 뉴스 클러스터링 같은 경우는 다중집합이 쓰였다. 문자열 내 마음대로 정렬하기 같은 경우, (자바) Comparator를 사용하여 정렬을 하는 문제였다. 두 문제 모두 인사이트가 있어 많이 배워갈 수 있어서 블로그로도 정리해두어 뿌듯한 것 같다. 다중집합을 어떻게 처리하면 좋을지 알게 되었고, 자바에서 Comparator로 어떻게 커스텀 정렬하는 지 알게 되었다. 비슷한 유형을 많이 풀어보면 좋을 것 같다.

🚀주간 목표 문제 수: 3개

푼 문제


프로그래머스 #17677. 뉴스 클러스터링: 구현 / Level3

정리한 링크: (바로가기)

🚩플로우 (선택)

코드를 풀이할 때 적었던 플로우가 있나요?

  1. 다중집합 만들기
    • 문자열을 2글자씩 끊기
    • 두 글자가 모두 알파벳일 때에만 저장하기 (isalpha() 이용)
    • 대소문자 구분이 없으므로 모두 대문자 또는 소문자 둘 중 하나로 통일하기 (upper() or lower() 이용)
  2. 다중집합 간의 교집합과 합집합 구하기
    • 다중집합은 중복된 원소를 포함할 수 있다. 따라서 remove()를 이용해서 하나씩 비교하며 처리한다.
    • 교집합: A 집합과 B 집합의 공통된 원소를 제거해가면서 교집합을 저장할 리스트(intersect)에 저장한다
    • 합집합: A의 차집합(A - B) + B의 차집합(B - A) + 교집합으로 구성한다.
  3. 자카드 유사도 구하기
    • 합집합이 공집합일 경우(=합집합 리스트 길이가 0), 유사도는 1로 처리한다.
    • 그게 아닐 경우, 교집합 / 합집합
  4. 정답 반환
    • 자카드 유사도 * 65536 의 정수 부분을 반환한다.

🚩제출한 코드

def solution(str1, str2):
    """
    1. 다중집합 만들기
    - 문자열을 2글자씩 끊기
    - 두 글자가 모두 알파벳일 때에만 저장하기 (`isalpha()` 이용)
    - 대소문자 구분이 없으므로 모두 대문자 또는 소문자 둘 중 하나로 통일하기 (`upper()` or `lower()` 이용)
		2. 다중집합 간의 교집합과 합집합 구하기
		    - 다중집합은 중복된 원소를 포함할 수 있다. 따라서 `remove()`를 이용해서 하나씩 비교하며 처리한다.
		    - 교집합: A 집합과 B 집합의 공통된 원소를 제거해가면서 교집합을 저장할 리스트(`intersect`)에 저장한다
		    - 합집합: A의 차집합(A - B) + B의 차집합(B - A) + 교집합으로 구성한다.
		3. 자카드 유사도 구하기
		    - 합집합이 공집합일 경우(=합집합 리스트 길이가 0), 유사도는 1로 처리한다.
		    - 그게 아닐 경우, `교집합 / 합집합`
		4. 정답 반환
		    - `자카드 유사도 * 65536` 의 정수 부분을 반환한다.
    """
    # 1. 다중집합 만들기
    a = []
    for i in range(len(str1)-1):
        if str1[i:i+2].isalpha():
            a.append(str1[i:i+2].upper())
    
    b = []
    for i in range(len(str2)-1):
        if str2[i:i+2].isalpha():
            b.append(str2[i:i+2].upper())
    
    # 2.1. 다중합집합 구하기
    union_set = a.copy()
    a_minus_b = a.copy() # A의 차집합
    
    for i in b:
        if i not in a_minus_b: # b에는 있지만 a에 있는 건 b의 차집합이다. 따라서 Union에 추가한다.
            union.append(i)
        else: # a_minus_b는 a의 차집합으로 b와 중복되는 게 있다면 지워야 한다.
            a_minus_b.remove(i)
                        
    # 2.2. 다중교집합 구하기
    inter_set = []
    for i in b:
        if i in a:
            a.remove(i)
            inter_set.append(i)
                  
    # 3. 자카드 유사도 계산
    if len(union) == 0: # 합집합이 0이라면 
        return 65536
    
    similarity = len(inter_set) / len(union)
        
    # 정답 출력
    return int(similarity * 65536)

💡TIL

배운 점이 있다면 입력해주세요

  • 다중합집합, 다중교집합을 어떻게 구해야하는지 막막했는데 차집합을 이용하면 된다는 것과 중복되는 값을 지움으로써 할 수 있다는 것을 알게 되었다.
  • 중간에 나름 예외처리를 신경쓴다고 했는데 65536을 곱해야 한다는 것을 깜빡했다. 문제 요구사항은 후반부에 까먹을 수 있으니 미리 적어두자.
  • [깊은 복사](https://crackerjacks.tistory.com/14)를 파이썬에서 어떻게 구현하는지 알게 되었다. 가장 간단한 방법은 copy()를 이용하면 될 것 같다.

프로그래머스 #12915. 문자열 내 마음대로 정렬하기(java): 구현 / Level1

정리한 링크: (바로가기)

🚩플로우 (선택)

코드를 풀이할 때 적었던 플로우가 있나요?

  • 문자열 정렬 기준이 n번째 문자이므로, 이 기준을 우선 정렬에 반영해야 한다.
  • 다만 동일한 문자일 경우 사전순으로 정렬해야 한다.

이를 위해서

  1. 먼저 오름차순으로 정렬한다.
  2. 이후, n번째 글자를 기준으로 오름차순 정렬한다.
    • 파이썬의 경우 lambda로 정렬한다.
    • 자바의 경우 Arrays.sort + Comparator를 활용해 정렬한다.

🚩제출한 코드

def solution(strings, n):
    """
		1. n번쨰 글자를 기준으로 오름차순 정렬. 
		2. 만약 같은 경우 사전순으로 앞선 문자열이 앞으로 와야 한다.
		실제 풀이 시간: 10분
    개선하는 시간: 3분
    """
    answer = []
    
    # n번쨰 기준으로 정렬하기 전에 전체 정렬
    strings.sort()
    
    # n번째 글자를 기준으로 오름차순 정렬
    answer = sorted(strings, key=lambda x: x[n])        
        
    return answer

자바 풀이

import java.util.*;

/*
1. n번쨰 글자를 기준으로 오름차순 정렬. 
2. 만약 같은 경우 사전순으로 앞선 문자열이 앞으로 와야 한다.
풀이 시간: 30분
*/
class Solution {
    public String[] solution(String[] strings, int n) {
        // n번쨰 기준으로 정렬하기 전에 전체 정렬
        Arrays.sort(strings);
        
        // n번째 글자를 기준으로 오름차순 정렬
        Arrays.sort(strings, new Comparator<String>() {
            @Override
            public int compare(String s1, String s2) {
                int index = n;
                char c1 = s1.charAt(index);
                char c2 = s2.charAt(index);
                return Character.compare(c1, c2);
            }
        });
        return strings;
    }
}

💡TIL

배운 점이 있다면 입력해주세요

  • lambda 를 이용해 정렬하는 건 매번 까먹는다… 이번 문제를 통해 다시 복습할 수 있었다.

    # 리스트 정렬 (단일 조건)
    data = [(1, 'b'), (3, 'a'), (2, 'c')]
    sorted_data = sorted(data, key=lambda x: x[1])  # 두 번째 요소를 기준으로 정렬
    print(sorted_data)  # 출력: [(3, 'a'), (1, 'b'), (2, 'c')]
    
    # 리스트 정렬 (다중 조건)
    data = [(1, 'b', 2), (3, 'a', 1), (1, 'c', 3), (3, 'b', 2)]
    sorted_data_multi = sorted(data, key=lambda x: (x[0], x[2])) # 첫 번째 요소를 기준으로 먼저 정렬하고, 같은 경우 두 번째 요소로 정렬
    print(sorted_data_multi) # 출력: [(1, 'b', 2), (1, 'c', 3), (3, 'a', 1), (3, 'b', 2)]
  • 공백없는 문자열을 하나의 문자열로 쪼개려면, splitjoinlist 로 해주어야 한다.

    text = " Hello World "
    words = text.split()
    text_no_space = "".join(words)
    substring_list = list(text_no_space[:5]) #문자열을 리스트로 변환
    print(substring_list) #출력: ['H', 'e', 'l', 'l', 'o']

    (하지만 이 문제의 경우, 굳이 이렇게 할 필요는 없었다.)

  • 자바에서 Arrays.sortComparator를 사용하여 커스텀 정렬하는 방법을 새로 알게 되었다. 다른 코테 문제에서도 이런 게 종종 등장할 것 같아서 꼭 알아두어야 할 것 같다.

  • Comparator 내의 compare메서드가 어떻게 동작하는건지 궁금해져서 정리해보았다.

  • 2번째 자바 풀이를 보면서 Comparator 없이 아이디어로 푼 것이 대단하게 느껴졌다. 이렇게 또 인사이트를 얻어간다.

  • 별 거 아니지만 자바에서 배열을 출력해서 보려면 아래처럼 toString 메서드를 사용하면 된다.

    System.out.println(Arrays.toString({배열명}));

프로그래머스 #12980. 점프와 순간이동(스킬체크 문제): 그리디 / Level2

정리한 링크: (바로가기)

🚩플로우 (선택)

코드를 풀이할 때 적었던 플로우가 있나요?

  • 일반적으로 0부터 N까지 "가는" 방향으로 접근하면 경우의 수가 너무 많다.
  • 반대로 N에서 0으로 "되돌아오는" 방식으로 생각하면 단순해진다.
  • 이 문제는 본질적으로 N을 이진수로 표현했을 때 1의 개수와 같다. 즉, 1을 뺄 때마다 건전지를 1씩 소모한다고 보면 된다.

🚩제출한 코드

def solution(n):
    """
    이동방법
    1. K칸 앞으로 점프 => 건전지 사용량 -K
    2. 순간이동: (현재까지 온 거리) * 2 => 건전지 사용량 X
    목표
    - 거리가 N만큼 떨어져있는 장소로 간다고 했을 때 건전지 사용량의 최솟값을 구하기
    """
    ans = 0
    while n > 0:
        if (n % 2 == 0):
              n //= 2
        else:
            n -= 1
            ans += 1    
    return ans

💡TIL

배운 점이 있다면 입력해주세요

  • 이 문제는 스킬체크할 때 등장한 문제로 스킬체크 풀이 후에 정리하는 문제이다. 처음에는 문제 설명이 길고 헷갈려서 어려워 보였지만, 핵심만 파악하면 매우 간단한 문제였다.
  • 순간이동과 점프를 이진수로 변환하여 1의 개수를 세는 풀이는 되게 새로웠다. 처음에는 잘 이해가 가지 않았지만 비트 단위로 접근하는 게 은근 유용한 것 같다.

프로그래머스 #42842. 카펫(스킬체크 문제): 완전탐색 / Level2

정리한 링크: (바로가기)

🚩플로우 (선택)

코드를 풀이할 때 적었던 플로우가 있나요?

🚩제출한 코드

def solution(brown, yellow):
    carpet_size = brown + yellow
    
    for w in range(1,int(carpet_size**0.5)+1): # 약수 범위 설정
        if carpet_size % w == 0: # 약수라면
            h = carpet_size // w
            
            if (2*w + 2*h - 4 == brown) and ((w-2)*(h-2) == yellow): # 조건에 해당하는지 확인
                return [max(w, h), min(w,h)]
            

💡TIL

배운 점이 있다면 입력해주세요

  • 이미 2번 풀었던 문제가 다행히 스킬체크 문제로 나왔다. 하지만 놀랍게도 어떻게 풀어야 할 지 기억이 나지 않아 꽤 애를 먹었다. 규칙이 있었던 것 같은데 규칙이 생각나지 않아 머리를 싸맸던 기억이 난다... 이 문제 말고도 이미 풀었던 문제를 여러 번 풀어보는 게 좋을 것 같다.

Copy link
Member

@YoonYn9915 YoonYn9915 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

저는 요즘 강의 듣고 프로젝트 하느라 바빠져서 그런지 알고리즘에 시간을 못 쓰게 되네요 ㅜㅜ 한 주 동안 4문제라도 푸신게 대단하신 것 같습니다!!

Copy link
Collaborator

@zaqquum zaqquum left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

바쁜 일정 속에 일주일 4문제라니..대단하십니다bb
이번 주도 고생하셨습니다

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

중복 원소를 허용하는 다중 집합이라는 개념은 처음 들어보네요! 참고해서 다음 주엔 저도 해당 문제를 풀어봐야겠어요ㅎ

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

감사합니다 ㅎㅎ
저도 @zaqquum 님 문제 풀어보고 싶어요!

@Mingguriguri
Copy link
Collaborator Author

저는 요즘 강의 듣고 프로젝트 하느라 바빠져서 그런지 알고리즘에 시간을 못 쓰게 되네요 ㅜㅜ 한 주 동안 4문제라도 푸신게 대단하신 것 같습니다!!

벌써 프로젝트 진행중이시군요!! 바쁘겠네요ㅠㅠ

@Mingguriguri Mingguriguri merged commit 031abb3 into main Jul 15, 2025
@github-actions
Copy link

🔥2025-07 챌린지 진행 상황

👉 그리디

  • Mingguriguri: 2개 ❌

👉 구현

  • Mingguriguri: 4개 ❌

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants